#!/bin/bash
# 启动服务器脚本
# 此脚本会检查端口是否被占用，如果占用则先杀掉占用进程，然后启动服务器

# 遇到错误时停止执行
set -e

# 设置要使用的端口
PORT=3001

# 输出彩色文本的函数
function print_color() {
    case $1 in
        "red") COLOR='\033[0;31m' ;;
        "green") COLOR='\033[0;32m' ;;
        "yellow") COLOR='\033[0;33m' ;;
        "blue") COLOR='\033[0;34m' ;;
        "purple") COLOR='\033[0;35m' ;;
        "cyan") COLOR='\033[0;36m' ;;
        *) COLOR='\033[0m' ;;
    esac
    NC='\033[0m' # No Color
    printf "${COLOR}$2${NC}\n"
}

# 显示标题
print_color "green" "====================================="
print_color "green" "   百炼 API 服务器启动脚本"
print_color "green" "====================================="
print_color "yellow" "正在检查端口 $PORT 是否被占用..."

# 检查端口是否被占用
if command -v lsof &> /dev/null; then
    # 使用 lsof 检查端口占用
    PORT_PID=$(lsof -ti:$PORT)
elif command -v netstat &> /dev/null; then
    # 使用 netstat 检查端口占用
    PORT_PID=$(netstat -tulpn 2>/dev/null | grep ":$PORT " | awk '{print $7}' | cut -d'/' -f1)
else
    print_color "red" "无法检查端口占用，请确保安装了 lsof 或 netstat"
    exit 1
fi

if [ ! -z "$PORT_PID" ]; then
    # 获取进程名称
    if command -v ps &> /dev/null; then
        PROCESS_NAME=$(ps -p $PORT_PID -o comm=)
        print_color "red" "端口 $PORT 被进程 $PROCESS_NAME (PID: $PORT_PID) 占用"
    else
        print_color "red" "端口 $PORT 被进程 PID: $PORT_PID 占用"
    fi

    print_color "yellow" "正在尝试终止该进程..."

    # 尝试终止进程
    kill -9 $PORT_PID 2>/dev/null
    if [ $? -eq 0 ]; then
        print_color "green" "进程已成功终止"

        # 等待一会儿，确保端口被释放
        sleep 2
    else
        print_color "red" "无法终止进程"
        print_color "red" "请手动终止该进程后再运行此脚本"
        exit 1
    fi
else
    print_color "green" "端口 $PORT 未被占用"
fi

# 检查环境变量
if [ -z "$DASHSCOPE_API_KEY" ]; then
    print_color "yellow" "未检测到 DASHSCOPE_API_KEY 环境变量"
    print_color "yellow" "如果需要使用官方 DashScope 兼容模式 API，请设置此环境变量"
fi

# 启动服务器
print_color "green" "正在启动服务器..."
print_color "cyan" "服务器将在 http://localhost:$PORT 上运行"
print_color "cyan" "按 Ctrl+C 停止服务器"
print_color "green" "====================================="

# 启动 Node.js 服务器
trap 'print_color "red" "\n\n脚本被中断"; exit 1' INT

try_start_server() {
    npm start
}

# 捕获错误
if ! try_start_server; then
    print_color "red" "\n启动服务器失败"
    print_color "yellow" "按任意键退出..."
    read -n 1
    exit 1
fi
